package com.pp.web.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pp.common.pojo.Post;
import com.pp.common.pojo.PostTag;
import com.pp.common.pojo.Tag;
import com.pp.common.pojo.User;
import com.pp.web.mapper.TagMapper;
import com.pp.web.service.IPostService;
import com.pp.web.service.IPostTagService;
import com.pp.web.service.ITagService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class TagServiceImpl extends ServiceImpl<TagMapper, Tag> implements ITagService {

    @Resource
    private IPostService postService;

    @Resource
    private IPostTagService postTagService;

    @Override
    public List<Tag> createTags(List<String> tagNames, User user) {
        List<Tag> tags = new ArrayList<>();

        // 遍历 tagNames 集合
        for (String tagName : tagNames) {
            // 检查 tag 是否已经存在
            Tag tag = this.baseMapper.selectOne(
                new LambdaQueryWrapper<Tag>().eq(Tag::getTagName, tagName)
            );

            // 若当前要添加的 tag 不存在
            if (tag == null) {
                // 构建要入库的 tag 对象
                tag = Tag.builder()
                         .tagName(tagName)
                         .createdUser(user.getUsername())
                         .updatedUser(user.getUsername())
                         .build();

                // 将新的 tag 对象入库
                this.baseMapper.insert(tag);

                // 注意: 此处 tag 在入库后，已经实现了主键的自动回显，即此时 tag 对象包含了主键 id 的值
                System.out.println("tag after insert: " + tag);
            // 若 tag 存在
            } else {
                // 则将当前 tag 下的帖子数量 postNum + 1
                tag.setPostNum(tag.getPostNum() + 1);
                // 并执行 tag 更新操作
                this.baseMapper.updateById(tag);
            }

            // 此时 tag 对象中的 id 有值
            tags.add(tag);
        }

        // 最后返回 tagList 用于给 IBmsPostServiceImpl 中添加 topic 与 tag 做准备
        return tags;
    }

    @Override
    @SuppressWarnings({"unchecked", "varargs"})
    public Page<Post> getPostsByTagId(Page<Post> pageResult, String tagId) {
        // 根据 tagId 获取对应的 topicId
        List<PostTag> postTags = postTagService.findByTagId(tagId);
        List<String> postIds = postTags.stream()
                                       .map(PostTag::getPostId)
                                       .collect(Collectors.toList());
        return postService.page(
            pageResult,
            new LambdaQueryWrapper<Post>()
                .in(Post::getId, postIds)
                .orderByDesc(Post::getViewNum, Post::getCommentNum)
        );
    }

}
